home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 676-700 / 682 / cybercron / cybercron.docs < prev    next >
Text File  |  1995-03-18  |  19KB  |  458 lines

  1.  
  2.                                  CyberCron
  3.  
  4.                 Copyright © 1992 by Christopher A. Wichura
  5.                            All rights reserved.
  6.  
  7.                         e-mail: caw@miroc.chi.il.us
  8.                                  BIX: caw
  9.  
  10. Legal Mumbo Jumbo
  11. ~~~~~~~~~~~~~~~~~
  12.  
  13. CyberCron is copyrighted material.  You are free to redistribute it so long
  14. as no charge is made on its distribution, except for costs of media and/or
  15. shipping.
  16.  
  17. In using CyberCron, you assume all liabilities for damage, loss of money,
  18. productivity or data that may occur while CyberCron is active.  Mr.
  19. Wichura can not and will not be held accountable.
  20.  
  21. Why another cron for the Amiga?
  22. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  23.  
  24. Because this one is meant for KickStart 2.04+ machines only!  It uses the
  25. new System() call instead of Execute(), giving more power over the commands
  26. run.  It also offers an extended set of options that may be specified for
  27. any given event.  An event can be either a normal executable or an ARexx
  28. script.  An ARexx port, based heavily on the one used in NazCron, is also
  29. available.  CyberCron also uses file notification to determine when the
  30. crontab has been changed.
  31.  
  32. Credits
  33. ~~~~~~~
  34.  
  35. Don Nafis, author of NazCron, from which I pretty much stole the idea for
  36. the initial ARexx command set recognized by CyberCron.
  37.  
  38. Thomas Rokicki for a little bit of magic in the GetSystemTime() routine.
  39.  
  40. Loren Rittle for, well, many things.  He's responsible for getting me to
  41. add the stuff needed to support writing 'at' and 'batch' UNIX like commands
  42. (though I hope to have done it in a means general and flexible enough that
  43. others may be able to use the event options in their own, new ways) and
  44. writing the at.rexx and batch.rexx scripts, despite the time presure he is
  45. under right now.  He also helped catch a number of bugs, offered little
  46. suggestions about functionality here and there and then there's always the
  47. __emit() trick in MySPrintfSupp() (I nearly cried when I saw it in his
  48. ls-4.5 code --- it never dawned on me to do anything so simple :->).
  49.  
  50. Usage
  51. ~~~~~
  52.  
  53. You can start CyberCron from either the CLI or Workbench.  No Workbench
  54. icon has been provided, however.  This is mainly for two reasons:  1) I'm a
  55. dreadfully bad artist and could never in my wildest dreams make a nice
  56. looking icon (if anyone wants to do it and send it to me, I'd appreciate
  57. it) and 2) the CLI is the recommended means to start CyberCron because it
  58. will have a CLI structure, and hence a path to propigate to the commands it
  59. starts.
  60.  
  61. CyberCron takes the following arguments:
  62.  
  63.     CronTab <filespec>
  64.     This specifies the crontab file to try and read.  If not specified,
  65.     it defaults to s:CronTab
  66.  
  67.     Logfile <filespec>
  68.     This indicates where CyberCron is to log activities.  If no
  69.     filespec is given, logging will be turned off.
  70.  
  71.     SendMail <sendmail command and opts>
  72.     CyberCron supports sending the output of a command it has run
  73.     to a user via e-mail.  For this to work, however, it needs to
  74.     know how to actually send the mail.  This command tells it
  75.     how to do this.  If it is omitted, entries which try to specify
  76.     output to e-mail will not have mail sent.
  77.  
  78.     The argument for this command should be in the form of
  79.  
  80.         "<sendmail command> <from switch> %s <realname switch> *"%s*""
  81.  
  82.     For example, for AmigaUUCP's sendmail, one would use
  83.  
  84.         "UUCP:c/SendMail -f %s -R *"%s*""
  85.  
  86.     The sendmail command __MUST__ support reading the mail file from
  87.     its standard input, as CyberCron sets up a pipe to redirect the
  88.     output into sendmail.  This also means that you must have PIPE:
  89.     mounted before mail can be sent.  The sendmail command must
  90.     also expect the To: and Subject: fields to be in the input instead
  91.     of on the command line, and must generate the Message-ID: itself.
  92.     AmigaUUCP's SendMail command does all this correctly.
  93.  
  94.     DefStack <stacksize>
  95.     This is the default stack to launch executables at.  Values less
  96.     than 2048 will be rejected.  This is ignored by ARexx events.
  97.     If not specified, the stack size that CyberCron was started
  98.     with will be used as the default.
  99.  
  100.     DefPriority <priority>
  101.     The default priority to launch executables at.  Also ignored
  102.     by ARexx events.  Defaults to 0.
  103.  
  104.     ConPri <priority>
  105.     This is the priority CyberCron should run at.  Defaults to no
  106.     change (i.e., it will remain at the priority it was started at).
  107.  
  108. To use these options from a Workbench icon, simply make each tooltype be in
  109. the form of <option>=<setting>.  For example, if you wanted to specify a
  110. logfile of T:CyberCronLog, you would have a tooltype that looked like
  111.  
  112.     LOGFILE=T:CyberCronLog
  113.  
  114. The CronTab File
  115. ~~~~~~~~~~~~~~~~
  116.  
  117. Lines in this file must be blank, a comment, or an event.  Comments are
  118. denoted by lines that start with a "#" symbol.  Events take the form of
  119.  
  120.     min hour day month dow command <command's args, if any>
  121.  
  122. in their simplest form.  Each of min, hour, day, month and dow (day of the
  123. week) are specifications for what range of values this command is to be run
  124. at.  A * indicates any value is acceptable.  Numeric digits specify
  125. specific values and can be seperated by a , (seperates distinct entries) or
  126. a - (used to indicate a range of entries).  For example,
  127.  
  128.     * * * * * Date
  129.  
  130. would run the command date every minute of every hour of every day of every
  131. month regardless of the day of the week.
  132.  
  133.     0 * * * * Date
  134.  
  135. is similar, but only runs the date command on the zeroth minute of each
  136. hour.
  137.  
  138.     1,5-10,25 * * * * Date
  139.  
  140. would run the date command on minutes 1, 5, 6, 7, 8, 9, 10 and 25 of each
  141. hour.
  142.  
  143. CyberCron also supports a number of extensions to the traditional event
  144. format.  These may occur anywhere in the event, and are
  145.  
  146.     :NAME <name>
  147.     The formal name this event will be known under when CyberCron is
  148.     accessed via its ARexx port.  You may use the same name multiple
  149.     times, but it is not recommended.
  150.  
  151.     < <filespec>
  152.     Specify where input is to be redirected from.
  153.  
  154.     > <filespec>
  155.     Specify where output is to be redirected.  If >> is used instead
  156.     of >, the filespec will the appended to instead of overwritten.
  157.  
  158.     :MAILUSER <username>
  159.     Specifies a user to send mail to with the output of the event
  160.     that was run.  If the SENDMAIL command line option was not
  161.     specified, this will be ignored when the event is started, and
  162.     any output redirection specified will be used, instead.
  163.  
  164.     The username may be any e-mail address, so mail can be sent
  165.     to both local and remote systems.  If your sendmail supports
  166.     it, you could even specify an alias and have it send mail to
  167.     multiple people.
  168.  
  169.     2> <filespec>
  170.     Specify where standard error is to be redirected.  If 2>> is used
  171.     instead of 2>, the filespec will be appended to instead of
  172.     overwritten.
  173.  
  174.     Note that this is currently ignored by the event launcher per a
  175.     discussion I had with Randell Jesup.  Standard error support
  176.     wasn't really finished for 2.0, and that makes it difficult
  177.     to support this at this time.
  178.  
  179.     :EXECONCE
  180.     After the event has been started, remove it from the event list.
  181.  
  182.     :OBEYQUEUE <queue name>
  183.     Select a specific queue to schedule this event under.  See the
  184.     section on queues below for more information.
  185.  
  186.     Using this, :EXECONCE, :MAILUSER and some ARexx macros, one could
  187.     simulate the 'at' and 'batch' commands under UNIX.  (See Loren's
  188.     'at' stuff for an example of how.)
  189.  
  190.     :NOLOG
  191.     If you specified a logfile then every time an event is started or
  192.     ends a message gets sent to the log file.  This turns off logging
  193.     for the specific event.  Handy for things one runs many, many
  194.     times, in keeping the size of your logfile from exploding.
  195.  
  196.     :REXX
  197.     Start this command using ARexx rather than trying to run it as a
  198.     system call.  If the first character of the command is "`" then
  199.     it will be started as an ARexx string rather than a command.
  200.  
  201.     :STACK <bytes>
  202.     The stacksize to use when launching this event.  Ignored for
  203.     ARexx events.  If the value specified is less than 2048, or this
  204.     option is omitted, then the default stack size will be used instead.
  205.  
  206.     :PRI <priority>
  207.     The priority to launch this event at.  Ignored for ARexx events.
  208.     If this option is omitted then the default priority will be used.
  209.  
  210.     :CUSTOMSH <shell name>
  211.     Use a specific custom shell when launching the event.  Ignored by
  212.     ARexx events.
  213.  
  214.     :SYSSH
  215.     If no custom shell is specified and this is not an ARexx event,
  216.     CyberCron will try and launch the command using the specified
  217.     User Shell.  If you do not want the User Shell to be used for
  218.     a specific event, specifying this flag will cause CyberCron to
  219.     use the system shell.
  220.  
  221. Please note that these above options are parsed with the dos.library
  222. ReadArgs() command.  Because of this, those options which take a variable
  223. must have whitespace between the option's keyword and its assignment.  This
  224. generally isn't a problem, except that most people I know are used to
  225. specifying redirection as
  226.  
  227.     >ram:foo
  228.  
  229. while the proper method for CyberCron would be
  230.  
  231.     > ram:foo
  232.  
  233. The other implication of using ReadArgs() is that quotes will be stripped
  234. out, as will extra spaces.  To retain spaces, you must inclose the element
  235. they proceed or follow with quotes.  For example, one might use
  236.  
  237.     date > "Ram:Two  Spaces"
  238.  
  239. To retain quotes, you will have to quote the argument as you would for
  240. spaces, but escape a quote character withing the quoted string.  For
  241. example.
  242.  
  243.     "This has a *" quote in it"
  244.  
  245. Job Queues and CyberCron
  246. ~~~~~~~~~~~~~~~~~~~~~~~~
  247.  
  248. CyberCron supports 26 job queues, named 'a' through 'z'.  Each queue has a
  249. maximum number of jobs associated with it.  If an event has a queue
  250. specified, not only must it be the appropriate time to run that event, but
  251. the number of events currently running under that queue must be less that
  252. the maximum allowed for the queue for the event to actually be executed.
  253.  
  254. Events that don't specify an :OBEYQUEUE argument are run under the default
  255. queue (not included in the 26 named queues that are user accessable), which
  256. allows an unlimited number of jobs to be executed at the same time.
  257.  
  258. All job queues are initilized with their maximum number of events to
  259. execute set to one.  ARexx commands exist to read and change the maximum
  260. number for specific queues.
  261.  
  262. Jobs that could not be started because the queue maximum would be exceeded
  263. are marked as delayed.  They will be run the next time the queue is
  264. available, regardless of whether or not their time spec matches the current
  265. time they are up for scheduling.
  266.  
  267. Job queues were originally added to support writting ARexx scripts that
  268. simulate the UNIX 'at' and 'batch' commands.  However, I've tried to make
  269. the interface flexible and useful in other areas.  For example, queues can
  270. be used to insure sequencing of events.  Make sure that the queue you will
  271. use has its maximum set to one (which is the default for all queues).
  272. Specify when the first job is to run.  Specify that the second job should
  273. run one minute after the first job.  If the first job is still running when
  274. the second comes up for scheduling, the second job will be delayed.
  275. CyberCron will check every minute after that to see if the first job has
  276. completed and will run the second job when it is safe.  Any number of jobs
  277. could be sequenced together using a queue in this manner.
  278.  
  279. CyberCron's ARexx Function Host
  280. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  281.  
  282. CyberCron's ARexx port name is CYBERCRON.  The following commands are
  283. supported:
  284.  
  285.     SHUTDOWN
  286.     Causes CyberCron to quit.  Can also be accomplished by sending
  287.     a break signal to CyberCron.  Once SHUTDOWN is started, CyberCron
  288.     will not accept any more ARexx commands.  It may take a while
  289.     for CyberCron to actually quit, however, because it must wait
  290.     for any currently running events to terminate.
  291.  
  292.     VERSION
  293.     Returns the version, revision and date of CyberCron in the form
  294.  
  295.         <version>.<revision> (<day>.<month>.<year>)
  296.  
  297.     This is returned in the RESULT string, so you must issue an
  298.     OPTIONS RESULTS command before you can use this command.
  299.  
  300.     SUSPEND
  301.     Stop processing events.  File notifcation on the crontab file
  302.     remains active, however, so changes will be processed normally.
  303.  
  304.     RESUME
  305.     Resume processing of events.
  306.  
  307.     NEW_EVENT_FILE <filespec>
  308.     Change the crontab file to <filespec>.  This checks to make
  309.     sure the file actually exists before making the change.
  310.     However, parse errors will not be noticed until the current
  311.     crontab has been purged and CyberCron actually starts reading
  312.     the new file.  If something goes wrong (crontab file not found
  313.     or its name is too long) which doesn't cause the previous
  314.     crontab file to have been purged yet then this will return
  315.     RC_WARN (5).  If a fatal error occurs (couldn't restart
  316.     notification on the new file) and the previous crontab has
  317.     been purged, but the new one not read in, this will return
  318.     RC_ERROR (10).
  319.  
  320.     CLOSE_EVENT_FILE
  321.     Free all entries from the CronTab.  Processing of entries
  322.     added by the ARexx ADD_EVENT command (see below) will still
  323.     continue.  Use NEW_EVENT_FILE to read a crontab file again,
  324.     if you so desire.
  325.  
  326.     NEW_LOG_FILE <filespec>
  327.     Changes the logfile to <filespec>.  If an error occurs (the
  328.     new name is too long, for example) then RC_WARN (5) will
  329.     be returned and the old logfile, if specified, will remain
  330.     active.
  331.  
  332.     CLOSE_LOG_FILE
  333.     Turns off logging.  You can re-enable logging with the
  334.     NEW_LOG_FILE command, if you so desire.
  335.  
  336.     SHOW_STATUS
  337.     Returns a couple bits of information about CyberCron's
  338.     status.  This is in the form of
  339.  
  340.         <activity> <crontab filespec> <logfile filespec>
  341.  
  342.     where <activity> is either ACTIVE or SUSPENDED.
  343.  
  344.     PURGE_REXX_EVENTS
  345.     All events added with the ARexx ADD_EVENT command (see
  346.     below) will be purged.  Processing of entries from the
  347.     crontab file will continue normally.
  348.  
  349.     ADD_EVENT <event>
  350.     Adds an event to CyberCron's active list.  Use the same
  351.     format as if you were specifying an event in a crontab
  352.     file.  Comments are not allowed.  If an error occurs
  353.     in parsing the event, RC_ERROR (10) will be returned.
  354.  
  355.     DELETE_REXX_EVENT <event>
  356.     Deletes the specified event, but only if it is was added
  357.     with the ARexx ADD_EVENT command.  See below for information
  358.     on naming of events.  If the event was not found, RC_ERROR
  359.     (10) will be returned.
  360.  
  361.     DELETE_EVENT <event>
  362.     Same as DELETE_REXX_EVENT, but can be used to delete any
  363.     event, even those read from the crontab file.
  364.  
  365.     LIST_EVENTS
  366.     Returns a list of all the current events CyberCron is
  367.     tracking, seperated by spaces.  Note that the events are
  368.     listed in CyberCron's internal coding.  See below for
  369.     more information on event name coding.  The result is returned
  370.     in a result string, so you must use OPTIONS RESULTS before
  371.     calling this command, or you will get an error.  If there
  372.     are no events, then the string "<None>" is returned.  If
  373.     an error occured, an empty string will be returned.
  374.  
  375.     SHOW_EVENT <event>
  376.     Returns the full specification for the specified event, as
  377.     it would be given in a crontab file, except that it will have
  378.     the event's internal name prepended.  Note that events
  379.     may not look exactly the same as when they were added.  This
  380.     is because CyberCron converts events into an internalized
  381.     structure and unconverts them when this command is called.
  382.     If the event was not found then an empty string will be
  383.     returned.  You must specify OPTIONS RESULTS before using
  384.     this command, or you will get an error.
  385.  
  386.     SET_QUEUE_MAX <queue name> <max jobs executable at a time>
  387.     Set's the maximum number of jobs that may be run under the
  388.     specified queue at any given time.  If an illegal queue
  389.     name is specified, RC_ERROR (10) will be returned.  Setting
  390.     the maximum to zero is legal, and will result in no jobs
  391.     for the specified queue being executed until such a time
  392.     as the queue maximum is raised to greater than zero again.
  393.  
  394.     GET_QUEUE_MAX <queue name>
  395.     Get the current maximum number of jobs that can be run
  396.     under the specified queue at any given time.  If an
  397.     illegal queue name is specified, -1 is returned.
  398.  
  399. CyberCron's Internal Event Naming
  400. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  401.  
  402. CyberCron's LIST_EVENTS command will return event names in an internalized
  403. format.  These names are in the form of 0x???????? where ? indicates a hex
  404. digit.  This is done so that events that have no formal name can be
  405. specified from ARexx.  It also allows events to be specified unambigously,
  406. which is useful if you have more than one event with the same formal name
  407. and you wish to delete/show/etc a specific one.  To prevent naming
  408. conflicts, CyberCron will not let you specify a formal name that begins
  409. with the characters 0x (or 0X, as the case of the "x" doesn't matter).
  410.  
  411. When asking CyberCron to delete/show/etc an event, you can either use its
  412. internal name, or, if it has a formal name, you may use that.  Internal
  413. names are cumbersome to use by hand, and are impractical to handle except by
  414. using console snap or under the control of an ARexx script.  Formal names
  415. are much easier to deal with, which is why they are present.  If you wanted
  416. to add a quick test event, you might give it a formal name of TestEvent and
  417. then use that to delete it instead of having to figure out it's internal
  418. name and then using it to delete the event.
  419.  
  420. Supplied files
  421. ~~~~~~~~~~~~~~
  422.  
  423. All source to CyberCron is included in the Source/* directory.  Please do
  424. not redistribute changes you make.  Instead, send them to me for inclusion
  425. in the master distribution.
  426.  
  427. The s directory contains a sample crontab file.  This is the one I am using
  428. on my system.
  429.  
  430. The rexx directory contains two rexx scripts.  The first, CyberCron.rexx,
  431. is what I use to start CyberCron from my user-startup and adds a few more
  432. events which are used mainly to wake me up in the morning.  You will
  433. definately want to modify this before attempting to use it.
  434.  
  435. The second, CCShow.rexx, is based on the NCShow.rexx script that came with
  436. NazCron.  It will call LIST_EVENTS and if there are active events, it will
  437. loop through the list calling SHOW_EVENT to display each one.
  438.  
  439. Also in the rexx directory you will find the files at.rexx, batch.rexx and
  440. id.lha.  These are the files Loren Rittle sent me that implement UNIX 'at'
  441. and 'batch' commands using CyberCron.  To use them, you need to extract the
  442. ID: device drivers into l:, extract the mountlist entry into devs: and then
  443. mount the ID: device.  Because of a strange bug in the id: device, you must
  444. us something along the lines of
  445.  
  446.     type id: >nil:
  447.  
  448. before you can use the at.rexx script.  I do this as part of my
  449. user-startup, just after the mount commamd.
  450.  
  451. Have fun and enjoy!
  452. ~~~~~~~~~~~~~~~~~~~
  453.  
  454. Christopher A. Wichura
  455. 5450 East View Park
  456. Chicago, Il.  60615
  457. (312)/684-2941 (evenings only, please -- I'm in the central time zone)
  458.